From c671da80d229f26c86ee96edccfb6678fcc1d948 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 23 Mar 2006 15:30:00 +0100 Subject: [PATCH] Rename generic_page_range as apply_to_page_range, export the symbol to GPL modules. Rename pte_page parameter to pmd_page (following the Linux idiom). apply_to_pte_range() should take the pte spinlock. Signed-off-by: Keir Fraser --- .../arch/i386/mm/ioremap-xen.c | 26 ++++++------ .../drivers/xen/balloon/balloon.c | 6 +-- .../drivers/xen/core/gnttab.c | 22 +++++----- linux-2.6-xen-sparse/drivers/xen/util.c | 8 ++-- linux-2.6-xen-sparse/include/linux/mm.h | 8 ++-- linux-2.6-xen-sparse/mm/memory.c | 42 ++++++++++--------- 6 files changed, 60 insertions(+), 52 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c index a9a32ba8fb..05f3daab98 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c @@ -32,13 +32,13 @@ #endif static int direct_remap_area_pte_fn(pte_t *pte, - struct page *pte_page, + struct page *pmd_page, unsigned long address, void *data) { mmu_update_t **v = (mmu_update_t **)data; - (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pte_page)) << + (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pmd_page)) << PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK); (*v)++; @@ -67,9 +67,9 @@ static int __direct_remap_pfn_range(struct mm_struct *mm, for (i = 0; i < size; i += PAGE_SIZE) { if ((v - u) == (PAGE_SIZE / sizeof(mmu_update_t))) { /* Fill in the PTE pointers. */ - rc = generic_page_range(mm, start_address, - address - start_address, - direct_remap_area_pte_fn, &w); + rc = apply_to_page_range(mm, start_address, + address - start_address, + direct_remap_area_pte_fn, &w); if (rc) goto out; w = u; @@ -93,8 +93,9 @@ static int __direct_remap_pfn_range(struct mm_struct *mm, if (v != u) { /* get the ptep's filled in */ - rc = generic_page_range(mm, start_address, address - start_address, - direct_remap_area_pte_fn, &w); + rc = apply_to_page_range(mm, start_address, + address - start_address, + direct_remap_area_pte_fn, &w); if (rc) goto out; rc = -EFAULT; @@ -142,11 +143,11 @@ int direct_kernel_remap_pfn_range(unsigned long address, EXPORT_SYMBOL(direct_kernel_remap_pfn_range); static int lookup_pte_fn( - pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { uint64_t *ptep = (uint64_t *)data; if (ptep) - *ptep = ((uint64_t)pfn_to_mfn(page_to_pfn(pte_page)) << + *ptep = ((uint64_t)pfn_to_mfn(page_to_pfn(pmd_page)) << PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK); return 0; } @@ -155,13 +156,14 @@ int create_lookup_pte_addr(struct mm_struct *mm, unsigned long address, uint64_t *ptep) { - return generic_page_range(mm, address, PAGE_SIZE, lookup_pte_fn, ptep); + return apply_to_page_range(mm, address, PAGE_SIZE, + lookup_pte_fn, ptep); } EXPORT_SYMBOL(create_lookup_pte_addr); static int noop_fn( - pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { return 0; } @@ -170,7 +172,7 @@ int touch_pte_range(struct mm_struct *mm, unsigned long address, unsigned long size) { - return generic_page_range(mm, address, size, noop_fn, NULL); + return apply_to_page_range(mm, address, size, noop_fn, NULL); } EXPORT_SYMBOL(touch_pte_range); diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c index d8327b0707..6f8039a0c0 100644 --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c @@ -517,7 +517,7 @@ void balloon_update_driver_allowance(long delta) } static int dealloc_pte_fn( - pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { unsigned long mfn = pte_mfn(*pte); int ret; @@ -547,8 +547,8 @@ struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) scrub_pages(vstart, 1 << order); balloon_lock(flags); - ret = generic_page_range( - &init_mm, vstart, PAGE_SIZE << order, dealloc_pte_fn, NULL); + ret = apply_to_page_range(&init_mm, vstart, + PAGE_SIZE << order, dealloc_pte_fn, NULL); BUG_ON(ret); current_pages -= 1UL << order; totalram_pages = current_pages; diff --git a/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c b/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c index 31b57d4dac..1049934008 100644 --- a/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c +++ b/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c @@ -360,7 +360,7 @@ gnttab_request_free_callback(struct gnttab_free_callback *callback, } #ifndef __ia64__ -static int map_pte_fn(pte_t *pte, struct page *pte_page, +static int map_pte_fn(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { unsigned long **frames = (unsigned long **)data; @@ -370,7 +370,7 @@ static int map_pte_fn(pte_t *pte, struct page *pte_page, return 0; } -static int unmap_pte_fn(pte_t *pte, struct page *pte_page, +static int unmap_pte_fn(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { @@ -384,6 +384,7 @@ gnttab_resume(void) { gnttab_setup_table_t setup; unsigned long frames[NR_GRANT_FRAMES]; + int rc; #ifndef __ia64__ void *pframes = frames; struct vm_struct *area; @@ -393,8 +394,8 @@ gnttab_resume(void) setup.nr_frames = NR_GRANT_FRAMES; setup.frame_list = frames; - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1)); - BUG_ON(setup.status != 0); + rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); + BUG_ON(rc || setup.status); #ifndef __ia64__ if (shared == NULL) { @@ -402,9 +403,10 @@ gnttab_resume(void) BUG_ON(area == NULL); shared = area->addr; } - BUG_ON(generic_page_range(&init_mm, (unsigned long)shared, - PAGE_SIZE * NR_GRANT_FRAMES, - map_pte_fn, &pframes)); + rc = apply_to_page_range(&init_mm, (unsigned long)shared, + PAGE_SIZE * NR_GRANT_FRAMES, + map_pte_fn, &pframes); + BUG_ON(rc); #else shared = __va(frames[0] << PAGE_SHIFT); printk("grant table at %p\n", shared); @@ -418,9 +420,9 @@ gnttab_suspend(void) { #ifndef __ia64__ - generic_page_range(&init_mm, (unsigned long)shared, - PAGE_SIZE * NR_GRANT_FRAMES, - unmap_pte_fn, NULL); + apply_to_page_range(&init_mm, (unsigned long)shared, + PAGE_SIZE * NR_GRANT_FRAMES, + unmap_pte_fn, NULL); #endif return 0; diff --git a/linux-2.6-xen-sparse/drivers/xen/util.c b/linux-2.6-xen-sparse/drivers/xen/util.c index 7f76a3903f..d7980f1a1a 100644 --- a/linux-2.6-xen-sparse/drivers/xen/util.c +++ b/linux-2.6-xen-sparse/drivers/xen/util.c @@ -6,9 +6,9 @@ #include #include -static int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +static int f(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { - /* generic_page_range() does all the hard work. */ + /* apply_to_page_range() does all the hard work. */ return 0; } @@ -24,8 +24,8 @@ struct vm_struct *alloc_vm_area(unsigned long size) * This ensures that page tables are constructed for this region * of kernel virtual address space and mapped into init_mm. */ - if (generic_page_range(&init_mm, (unsigned long)area->addr, - area->size, f, NULL)) { + if (apply_to_page_range(&init_mm, (unsigned long)area->addr, + area->size, f, NULL)) { free_vm_area(area); return NULL; } diff --git a/linux-2.6-xen-sparse/include/linux/mm.h b/linux-2.6-xen-sparse/include/linux/mm.h index 4a05b8db0d..946f3e52a5 100644 --- a/linux-2.6-xen-sparse/include/linux/mm.h +++ b/linux-2.6-xen-sparse/include/linux/mm.h @@ -1020,10 +1020,10 @@ struct page *follow_page(struct vm_area_struct *, unsigned long address, #define FOLL_ANON 0x08 /* give ZERO_PAGE if no pgtable */ #ifdef CONFIG_XEN -typedef int (*pte_fn_t)(pte_t *pte, struct page *pte_page, unsigned long addr, - void *data); -extern int generic_page_range(struct mm_struct *mm, unsigned long address, - unsigned long size, pte_fn_t fn, void *data); +typedef int (*pte_fn_t)(pte_t *pte, struct page *pmd_page, unsigned long addr, + void *data); +extern int apply_to_page_range(struct mm_struct *mm, unsigned long address, + unsigned long size, pte_fn_t fn, void *data); #endif #ifdef CONFIG_PROC_FS diff --git a/linux-2.6-xen-sparse/mm/memory.c b/linux-2.6-xen-sparse/mm/memory.c index 103c724be1..f91d3bab09 100644 --- a/linux-2.6-xen-sparse/mm/memory.c +++ b/linux-2.6-xen-sparse/mm/memory.c @@ -1378,36 +1378,39 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, EXPORT_SYMBOL(remap_pfn_range); #ifdef CONFIG_XEN -static inline int generic_pte_range(struct mm_struct *mm, pmd_t *pmd, - unsigned long addr, unsigned long end, - pte_fn_t fn, void *data) +static inline int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long end, + pte_fn_t fn, void *data) { pte_t *pte; int err; - struct page *pte_page; + struct page *pmd_page; + spinlock_t *ptl; pte = (mm == &init_mm) ? pte_alloc_kernel(pmd, addr) : - pte_alloc_map(mm, pmd, addr); + pte_alloc_map_lock(mm, pmd, addr, &ptl); if (!pte) return -ENOMEM; - pte_page = pmd_page(*pmd); + BUG_ON(pmd_huge(*pmd)); + + pmd_page = pmd_page(*pmd); do { - err = fn(pte, pte_page, addr, data); + err = fn(pte, pmd_page, addr, data); if (err) break; } while (pte++, addr += PAGE_SIZE, addr != end); if (mm != &init_mm) - pte_unmap(pte-1); + pte_unmap_unlock(pte-1, ptl); return err; } -static inline int generic_pmd_range(struct mm_struct *mm, pud_t *pud, - unsigned long addr, unsigned long end, - pte_fn_t fn, void *data) +static inline int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud, + unsigned long addr, unsigned long end, + pte_fn_t fn, void *data) { pmd_t *pmd; unsigned long next; @@ -1418,16 +1421,16 @@ static inline int generic_pmd_range(struct mm_struct *mm, pud_t *pud, return -ENOMEM; do { next = pmd_addr_end(addr, end); - err = generic_pte_range(mm, pmd, addr, next, fn, data); + err = apply_to_pte_range(mm, pmd, addr, next, fn, data); if (err) break; } while (pmd++, addr = next, addr != end); return err; } -static inline int generic_pud_range(struct mm_struct *mm, pgd_t *pgd, - unsigned long addr, unsigned long end, - pte_fn_t fn, void *data) +static inline int apply_to_pud_range(struct mm_struct *mm, pgd_t *pgd, + unsigned long addr, unsigned long end, + pte_fn_t fn, void *data) { pud_t *pud; unsigned long next; @@ -1438,7 +1441,7 @@ static inline int generic_pud_range(struct mm_struct *mm, pgd_t *pgd, return -ENOMEM; do { next = pud_addr_end(addr, end); - err = generic_pmd_range(mm, pud, addr, next, fn, data); + err = apply_to_pmd_range(mm, pud, addr, next, fn, data); if (err) break; } while (pud++, addr = next, addr != end); @@ -1449,8 +1452,8 @@ static inline int generic_pud_range(struct mm_struct *mm, pgd_t *pgd, * Scan a region of virtual memory, filling in page tables as necessary * and calling a provided function on each leaf page table. */ -int generic_page_range(struct mm_struct *mm, unsigned long addr, - unsigned long size, pte_fn_t fn, void *data) +int apply_to_page_range(struct mm_struct *mm, unsigned long addr, + unsigned long size, pte_fn_t fn, void *data) { pgd_t *pgd; unsigned long next; @@ -1461,12 +1464,13 @@ int generic_page_range(struct mm_struct *mm, unsigned long addr, pgd = pgd_offset(mm, addr); do { next = pgd_addr_end(addr, end); - err = generic_pud_range(mm, pgd, addr, next, fn, data); + err = apply_to_pud_range(mm, pgd, addr, next, fn, data); if (err) break; } while (pgd++, addr = next, addr != end); return err; } +EXPORT_SYMBOL_GPL(apply_to_page_range); #endif /* -- 2.30.2